/**
 * 
 */
package model.container;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;

import model.AangebodenCursus;
import model.Cursus;
import persistenty.ContainerTekstPersisteerbaar;

/**
 * This class is intended to setup the Cursussen container object.
 * 
 * @author Nicolas Vanderhulst
 * @version 20111009
 * 
 */
public class AangebodenCursussen extends ContainerTekstPersisteerbaar implements Comparable<AangebodenCursussen>,
		Iterable<AangebodenCursus>, Cloneable {
	public HashSet<AangebodenCursus> aangebodenCursussen;
	private Cursussen cursusContainer;
	private Lectoren lectorContainer;

	/**
	 * @param cursussen
	 *            the cursussen to set
	 */

	public void setCursussen(Cursussen cursussen) {
		this.cursusContainer = cursussen;
	}

	public void setLectoren(Lectoren lectoren) {
		this.lectorContainer = lectoren;
	}

	private int aangebodenCursusID = 0;

	/**
	 * @return the cursusID
	 */
	public int getCursusID() {
		return aangebodenCursusID;
	}

	/**
	 * @param cursusID
	 *            the cursusID to set
	 */
	public void setCursusID(int cursusID) {
		this.aangebodenCursusID = cursusID;
	}

	public AangebodenCursussen() throws CursussenException {
		aangebodenCursussen = new HashSet<AangebodenCursus>();
		persistentyFiles = new ArrayList<String>();
		persistentyFiles.add("src/persitentyfiles/AangebodenCursus.txt");
	}

	public void add(AangebodenCursus c) throws CloneNotSupportedException, CursussenException {
		c.setAangebodenCursusId(this.aangebodenCursussen.size() + 1);
		if (!aangebodenCursussen.add(c)) {
			throw new CursussenException("Deze cursus bestaat reeds");
		}
		try {
			BufferedWriter writer = new BufferedWriter(new FileWriter(String.format("src/persitentyfiles/%s.txt", c
					.getClass().getSimpleName()), true));
			writer.append(c.maakTekstVanObject());
			writer.close();
		} catch (IOException ioException) {
			ioException.printStackTrace();
		}
	}

	public void remove(Cursus c) {
		aangebodenCursussen.remove(c);
	}

	public boolean checkCursusExists(AangebodenCursus a) throws CloneNotSupportedException {
		boolean b = false;
		for (AangebodenCursus c : aangebodenCursussen) {
			if (c.equals(a)) {
				b = true;
			}
		}
		return b;
	}

	public boolean checkCursusCodeExists(AangebodenCursus a) throws CloneNotSupportedException {
		boolean b = false;
		for (AangebodenCursus c : aangebodenCursussen) {
			if (c.getAangebodenCursusId() == a.getAangebodenCursusId()) {
				b = true;
			}
		}
		return b;
	}

	public StringBuffer getCursussenPerVak(String cursusNaam) {
		int cursusCount = 0;
		StringBuffer aangebodenCursussenAlsString = new StringBuffer();
		for (AangebodenCursus c : aangebodenCursussen) {
			if (c.getAangebodenCursus().getCursusNaam().equalsIgnoreCase(cursusNaam)) {
				{
					aangebodenCursussenAlsString.append("Lector: " + c.getLector().getLectorNaam() + "\t");
					aangebodenCursussenAlsString.append("Plaatsen: " + c.getAantalPlaatsen() + "\t");
					aangebodenCursussenAlsString.append("Lokaal: " + c.getLokaal().toString() + "\t");
					aangebodenCursussenAlsString.append("Tijdstip: " + c.getTijdsMoment().toString() + "\n");
					cursusCount++;
				}
			}
		}
		if (cursusCount == 0) {
			aangebodenCursussenAlsString = null;
			aangebodenCursussenAlsString = new StringBuffer();
			aangebodenCursussenAlsString.append("Geen geplande cursussen voor het vak: " + cursusNaam);
		}
		return aangebodenCursussenAlsString;
	}

	@SuppressWarnings("boxing")
	public String[] getCursussen() {
		int i = 0;
		String[] aangebodenCursussenAlsString = new String[aangebodenCursussen.size()];
		Iterator<AangebodenCursus> it = aangebodenCursussen.iterator();
		while (it.hasNext()) {
			AangebodenCursus ac = it.next();
			aangebodenCursussenAlsString[i] = String.format(
					"ID: %s  Vak: %s  Studiepunten: %s  Plaatsen: %s   Tijdstip: %s", ac.getAangebodenCursusId(), ac
							.getAangebodenCursus().getCursusNaam(), ac.getAangebodenCursus().getStudiePunten(), ac
							.getAantalPlaatsen(), ac.getTijdsMoment().toStringForListbox());
			i++;
		}
		return aangebodenCursussenAlsString;

	}

	public AangebodenCursus getAangebCursusByID(int ID) {
		AangebodenCursus tempCursus = null;
		for (AangebodenCursus ac : this.aangebodenCursussen) {
			if (ac.getAangebodenCursusId() == ID) {
				tempCursus = ac;
			}
		}
		return tempCursus;
	}

	@Override
	public Iterator<AangebodenCursus> iterator() {
		return aangebodenCursussen.iterator();
	}

	@Override
	public int compareTo(AangebodenCursussen arg0) {
		return this.toString().compareTo(arg0.toString());
	}

	@Override
	public void schrijven() throws IOException {
		try {
			BufferedWriter writer = new BufferedWriter(
					new FileWriter("src/persitentyfiles/AangebodenCursus.txt", false));
			for (AangebodenCursus c : aangebodenCursussen) {
				writer.write(c.maakTekstVanObject());
			}
			writer.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((aangebodenCursussen == null) ? 0 : aangebodenCursussen.hashCode());
		return result;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (obj == null) {
			return false;
		}
		if (!(obj instanceof Cursussen)) {
			return false;
		}
		AangebodenCursussen other = (AangebodenCursussen) obj;
		if (aangebodenCursussen == null) {
			if (other.aangebodenCursussen != null) {
				return false;
			}
		} else if (!aangebodenCursussen.equals(other.aangebodenCursussen)) {
			return false;
		}
		return true;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Aangeboden Cursussen [cursussen=" + aangebodenCursussen + "]";
	}

	/**
	 * @return Cursus
	 * @see java.util.HashSet#clone()
	 */
	@Override
	public Object clone() {
		return aangebodenCursussen.clone();
	}

	@Override
	public void createObject() throws CursussenException, CloneNotSupportedException, InschrijvingenException,
			LectorenException, Exception {
		try {
			AangebodenCursus aangebodencursus = null;
			if (inputFile.equalsIgnoreCase("src/persitentyfiles/AangebodenCursus.txt")) {
				aangebodencursus = new AangebodenCursus();
			}
			if (aangebodencursus != null) {
				aangebodencursus = aangebodencursus.maakObjectVanTekst(objectAlsTekst);
				aangebodencursus.addCursusVanTekst(objectAlsTekst, cursusContainer);
				aangebodencursus.addLectorVanTekst(objectAlsTekst, lectorContainer);
				aangebodenCursussen.add(aangebodencursus);
				aangebodenCursusID = (aangebodenCursusID < aangebodencursus.getAangebodenCursusId() ? aangebodencursus
						.getAangebodenCursusId() : aangebodenCursusID);
			}
		} catch (NumberFormatException e) {
			e.printStackTrace();
		}
	}

}
